What is Operation Sticky Gate?

Major League Baseball’s 2021 season has been marked by record breaking statistics. Particularly the record low ERA’s, extremely high spin rates, and a record breaking amount of no-hitters a few months into the season. Baseball is a game many consider boring from lack of action… -avg spin rate prior to June 1st was around 2280 -mention the og steroid era -data from start of season to June 1, and June 1 to July 17, from Baseball Savant. -sinkers and curveballs

Before the Crackdown

For a long time MLB teams had what some would call a gentleman’s agreement over utilizing foreign substances. Initially this started as a way for pitchers to better their grip on the ball when they pitched. Yet, now it’s gotten to the point that the foreign substances are so sticky that instead of just helping the pitchers grip the ball, it’s making the ball stick to their hand for longer, thus increasing the spin rate of the ball and making it harder to hit. As the spin of the ball increases the general location in which the ball is getting thrown is higher, adding to the difficulties hitters are facing. The spin on pitches like the 4-seam fastballs is a back spin, which opposes the downward force of gravity on the ball (think of the term ‘rising fastball’).

The MLB made a decision coming out against foreign substances by stating that starting on June 1st umpires will begin checking for pitchers using foreign substances and on June 16th announced players caught using them will be removed from the game, placed on a 10 game suspension, and fined. Many people have argued that these statements won’t deter pitchers from utilizing foreign substances. Yet many analysts have been saying spin rates going down and batting averages going up. In this notebook we will be examining the affect of the MLB’s new implementation and examining changes with individual players.

The data referenced has been provided by Baseball Savant and Baseball Reference.

Velocity vs Spin Rate

It’s important to note that generally as increases velocity so does spin rate. In this section we will be comparing pitchers spin rates vs velocities before and after June 1st.

library(ggplot2) ## loading packages
library(ggExtra)
library(dplyr)
library(tidyverse)
b4 <-
  read.csv('b4June1.csv')
b4
b4gr <-
  b4 %>%
  ggplot(aes(x = velocity, y = spin_rate, color = total_pitches)) +
  geom_point(stat = 'identity') +
  xlab('Velocity (mph)') +
  ylab('Spin Rate (rpm)') +
  ggtitle('Spin Rate VS Velocity Prior to June 1st') +
  labs(color = 'Total Pitches')

p1 <-
  ggMarginal(b4gr, type = 'histogram')
p1

  • insert analysis *
aft <-
  read.csv('aftJune1st.csv')
aft
aftgr <-
  aft %>%
  ggplot(aes(x = velocity, y = spin_rate, color = total_pitches)) +
  geom_point(stat = 'identity') +
  xlab('Velocity (mph)') +
  ylab('Spin Rate (rpm)') +
  ggtitle('Spin Rate VS Velocity After June 1st') +
  labs(color = 'Total Pitches')

p2 <-
  ggMarginal(aftgr, type = 'histogram')
p2

p1

Based on these general scatterplots there doesn’t seem to be a large change between between spin rate and velocity. The boxplots on the side show that… -most of the outliers are darker shaded dots showing that those pitchers generally haven’t thrown as many pitches. -Now let’s change the range in the number of pitches to above 325….

b4abv <-
  b4%>%
  filter(total_pitches > 249)
b4abv
aftabv <-
  aft%>%
  filter(total_pitches > 249)
aftabv
babvgr <-
  b4abv %>%
  ggplot(aes(x = velocity, y = spin_rate, color = total_pitches)) +
  geom_point(stat = 'identity') +
  xlab('Velocity (mph)') +
  ylab('Spin Rate (rpm)') +
  labs(color = 'Total Pitches',
       title = 'Spin Rate vs Velocity Before June 1st',
       caption = 'For pitchers with over 250 pitches') +
  scale_color_viridis_c()
afabvgr <-
  aftabv %>%
  ggplot(aes(x = velocity, y = spin_rate, color = total_pitches)) +
  geom_point(stat = 'identity') +
  xlab('Velocity (mph)') +
  ylab('Spin Rate (rpm)') +
  labs(color = 'Total Pitches',
       title = 'Spin Rate vs Velocity After June 1st',
       caption = 'For pitchers with over 250 pitches') +
  scale_color_viridis_c()

k1 <- 
  ggMarginal(afabvgr, type = 'histogram')
k1


g1 <-
  ggMarginal(babvgr, type = 'histogram')
g1

Here we can see that…

Individual Pitcher Changes

Trevor Bauer

It’s hard to have any conversation about foreign substances in baseball without mentioning Trevor Bauer. From being someone who initially spoken against foreign substances, once even stating that they could be more powerful than steroids, to now being accused of having the most effective substance combination in the game, Bauer’s name has been brought up a lot.

bauer <-
  read.csv('bauer advanced stats.csv')
bauer
tbju28 <-
  bauer %>%
  filter(game_date == '2021-06-28')
tbju28
tb28gr <-
  tbju28%>%
  ggplot(aes(x = at_bat_number , y = release_spin_rate, color = pitch_name)) +
  geom_line(stat = 'identity')+
  xlab('At Bat Number') +
  ylab('Release Spin Rate') +
  labs(title = "Trevor Bauer's Spin Rate by Pitch Type",
       color = 'Pitch Name',
       caption = 'From his last game on June 28th')
tb28gr

tbju6 <-
  bauer %>%
  filter(game_date == '2021-06-06')
tbju6
tb6gr <-
  tbju6%>%
  ggplot(aes(x = at_bat_number , y = release_spin_rate, color = pitch_name)) +
  geom_line(stat = 'identity')+
  xlab('At Bat Number') +
  ylab('Release Spin Rate') +
  labs(title = "Trevor Bauer's Spin Rate by Pitch Type",
       color = 'Pitch Name',
       caption = 'From his last game on June 6th')
tb6gr

tb28gr

Jacob deGrom

Gerrit Cole

gcoledt <-
  read.csv('Gerrit Cole advanced stats.csv')
gcoledt
gcju3 <-
  gcoledt %>%
  filter(game_date == '2021-06-03')
gcju3
gcjl10 <-
  gcoledt %>%
  filter(game_date == '2021-07-10')
gcjl10
gcju3gr <-
  gcju3 %>%
  ggplot(aes(x = at_bat_number, y = release_spin_rate, color = pitch_name)) +
  geom_line(stat = 'identity') +
  xlab('At Bat Number') +
  ylab('Release Spin Rate') +
  labs(title = "Gerrit Cole's Spin Rate by Pitch",
       caption = 'From the game pitched on June 3rd',
       color = 'Pitch Type')
gcju3gr

gcjl10gr <-
  gcjl10 %>%
  ggplot(aes(x = at_bat_number, y = release_spin_rate, color = pitch_name)) +
  geom_line(stat = 'identity') +
  xlab('Number At Bat') +
  ylab('Release Spin Rate') +
  labs(title = "Gerrit Cole's Spin Rate by Pitch Type",
       caption = 'From the game Cole pitched on July 10th',
       color = 'Pitch Type') +
  facet_grid(scales = 'fixed')
gcjl10gr

gcju3gr

Julio Urias

Garrett Richards

LS0tCmF1dGhvcjogTW9qaXNvbHV3YSAoSmlzbykgQXdlCnRpdGxlOiAiT3BlcmF0aW9uIFN0aWNreSBHYXRlIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIFdoYXQgaXMgT3BlcmF0aW9uIFN0aWNreSBHYXRlPwoKTWFqb3IgTGVhZ3VlIEJhc2ViYWxsJ3MgMjAyMSBzZWFzb24gaGFzIGJlZW4gbWFya2VkIGJ5IHJlY29yZCBicmVha2luZyBzdGF0aXN0aWNzLiBQYXJ0aWN1bGFybHkgdGhlIHJlY29yZCBsb3cgRVJBJ3MsIGV4dHJlbWVseSBoaWdoIHNwaW4gcmF0ZXMsIGFuZCBhIHJlY29yZCBicmVha2luZyBhbW91bnQgb2Ygbm8taGl0dGVycyBhIGZldyBtb250aHMgaW50byB0aGUgc2Vhc29uLiBCYXNlYmFsbCBpcyBhIGdhbWUgbWFueSBjb25zaWRlciBib3JpbmcgZnJvbSBsYWNrIG9mIGFjdGlvbi4uLgotYXZnIHNwaW4gcmF0ZSBwcmlvciB0byBKdW5lIDFzdCB3YXMgYXJvdW5kIDIyODAKLW1lbnRpb24gdGhlIG9nIHN0ZXJvaWQgZXJhCi1kYXRhIGZyb20gc3RhcnQgb2Ygc2Vhc29uIHRvIEp1bmUgMSwgYW5kIEp1bmUgMSB0byBKdWx5IDE3LCBmcm9tIEJhc2ViYWxsIFNhdmFudC4KLXNpbmtlcnMgYW5kIGN1cnZlYmFsbHMKCiMgQmVmb3JlIHRoZSBDcmFja2Rvd24KCkZvciBhIGxvbmcgdGltZSBNTEIgdGVhbXMgaGFkIHdoYXQgc29tZSB3b3VsZCBjYWxsIGEgZ2VudGxlbWFuJ3MgYWdyZWVtZW50IG92ZXIgdXRpbGl6aW5nIGZvcmVpZ24gc3Vic3RhbmNlcy4gSW5pdGlhbGx5IHRoaXMgc3RhcnRlZCBhcyBhIHdheSBmb3IgcGl0Y2hlcnMgdG8gYmV0dGVyIHRoZWlyIGdyaXAgb24gdGhlIGJhbGwgd2hlbiB0aGV5IHBpdGNoZWQuIFlldCwgbm93IGl0J3MgZ290dGVuIHRvIHRoZSBwb2ludCB0aGF0IHRoZSBmb3JlaWduIHN1YnN0YW5jZXMgYXJlIHNvIHN0aWNreSB0aGF0IGluc3RlYWQgb2YganVzdCBoZWxwaW5nIHRoZSBwaXRjaGVycyBncmlwIHRoZSBiYWxsLCBpdCdzIG1ha2luZyB0aGUgYmFsbCBzdGljayB0byB0aGVpciBoYW5kIGZvciBsb25nZXIsIHRodXMgaW5jcmVhc2luZyB0aGUgc3BpbiByYXRlIG9mIHRoZSBiYWxsIGFuZCBtYWtpbmcgaXQgaGFyZGVyIHRvIGhpdC4gQXMgdGhlIHNwaW4gb2YgdGhlIGJhbGwgaW5jcmVhc2VzIHRoZSBnZW5lcmFsIGxvY2F0aW9uIGluIHdoaWNoIHRoZSBiYWxsIGlzIGdldHRpbmcgdGhyb3duIGlzIGhpZ2hlciwgYWRkaW5nIHRvIHRoZSBkaWZmaWN1bHRpZXMgaGl0dGVycyBhcmUgZmFjaW5nLiBUaGUgc3BpbiBvbiBwaXRjaGVzIGxpa2UgdGhlIDQtc2VhbSBmYXN0YmFsbHMgaXMgYSBiYWNrIHNwaW4sIHdoaWNoIG9wcG9zZXMgdGhlIGRvd253YXJkIGZvcmNlIG9mIGdyYXZpdHkgb24gdGhlIGJhbGwgKHRoaW5rIG9mIHRoZSB0ZXJtICdyaXNpbmcgZmFzdGJhbGwnKS4gCgpUaGUgTUxCIG1hZGUgYSBkZWNpc2lvbiBjb21pbmcgb3V0IGFnYWluc3QgZm9yZWlnbiBzdWJzdGFuY2VzIGJ5IHN0YXRpbmcgdGhhdCBzdGFydGluZyBvbiBKdW5lIDFzdCB1bXBpcmVzIHdpbGwgYmVnaW4gY2hlY2tpbmcgZm9yIHBpdGNoZXJzIHVzaW5nIGZvcmVpZ24gc3Vic3RhbmNlcyBhbmQgb24gSnVuZSAxNnRoIGFubm91bmNlZCBwbGF5ZXJzIGNhdWdodCB1c2luZyB0aGVtIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBnYW1lLCBwbGFjZWQgb24gYSAxMCBnYW1lIHN1c3BlbnNpb24sIGFuZCBmaW5lZC4gTWFueSBwZW9wbGUgaGF2ZSBhcmd1ZWQgdGhhdCB0aGVzZSBzdGF0ZW1lbnRzIHdvbid0IGRldGVyIHBpdGNoZXJzIGZyb20gdXRpbGl6aW5nIGZvcmVpZ24gc3Vic3RhbmNlcy4gWWV0IG1hbnkgYW5hbHlzdHMgaGF2ZSBiZWVuIHNheWluZyBzcGluIHJhdGVzIGdvaW5nIGRvd24gYW5kIGJhdHRpbmcgIGF2ZXJhZ2VzIGdvaW5nIHVwLiBJbiB0aGlzIG5vdGVib29rIHdlIHdpbGwgYmUgZXhhbWluaW5nIHRoZSBhZmZlY3Qgb2YgdGhlIE1MQidzIG5ldyBpbXBsZW1lbnRhdGlvbiBhbmQgZXhhbWluaW5nIGNoYW5nZXMgd2l0aCBpbmRpdmlkdWFsIHBsYXllcnMuCgpUaGUgZGF0YSByZWZlcmVuY2VkIGhhcyBiZWVuIHByb3ZpZGVkIGJ5IEJhc2ViYWxsIFNhdmFudCBhbmQgQmFzZWJhbGwgUmVmZXJlbmNlLgoKCgojIyBWZWxvY2l0eSB2cyBTcGluIFJhdGUKCkl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBnZW5lcmFsbHkgYXMgaW5jcmVhc2VzIHZlbG9jaXR5IHNvIGRvZXMgc3BpbiByYXRlLiBJbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCBiZSBjb21wYXJpbmcgcGl0Y2hlcnMgc3BpbiByYXRlcyB2cyB2ZWxvY2l0aWVzIGJlZm9yZSBhbmQgYWZ0ZXIgSnVuZSAxc3QuCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKSAjIyBsb2FkaW5nIHBhY2thZ2VzCmxpYnJhcnkoZ2dFeHRyYSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKCgpgYGB7cn0KYjQgPC0KICByZWFkLmNzdignYjRKdW5lMS5jc3YnKQpiNApgYGAKCgoKYGBge3J9CmI0Z3IgPC0KICBiNCAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2ZWxvY2l0eSwgeSA9IHNwaW5fcmF0ZSwgY29sb3IgPSB0b3RhbF9waXRjaGVzKSkgKwogIGdlb21fcG9pbnQoc3RhdCA9ICdpZGVudGl0eScpICsKICB4bGFiKCdWZWxvY2l0eSAobXBoKScpICsKICB5bGFiKCdTcGluIFJhdGUgKHJwbSknKSArCiAgZ2d0aXRsZSgnU3BpbiBSYXRlIFZTIFZlbG9jaXR5IFByaW9yIHRvIEp1bmUgMXN0JykgKwogIGxhYnMoY29sb3IgPSAnVG90YWwgUGl0Y2hlcycpCgpwMSA8LQogIGdnTWFyZ2luYWwoYjRnciwgdHlwZSA9ICdoaXN0b2dyYW0nKQpwMQpgYGAKCiAqIGluc2VydCBhbmFseXNpcyAqCiAKIAogCiAKYGBge3J9CmFmdCA8LQogIHJlYWQuY3N2KCdhZnRKdW5lMXN0LmNzdicpCmFmdApgYGAKCgpgYGB7cn0KYWZ0Z3IgPC0KICBhZnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmVsb2NpdHksIHkgPSBzcGluX3JhdGUsIGNvbG9yID0gdG90YWxfcGl0Y2hlcykpICsKICBnZW9tX3BvaW50KHN0YXQgPSAnaWRlbnRpdHknKSArCiAgeGxhYignVmVsb2NpdHkgKG1waCknKSArCiAgeWxhYignU3BpbiBSYXRlIChycG0pJykgKwogIGdndGl0bGUoJ1NwaW4gUmF0ZSBWUyBWZWxvY2l0eSBBZnRlciBKdW5lIDFzdCcpICsKICBsYWJzKGNvbG9yID0gJ1RvdGFsIFBpdGNoZXMnKQoKcDIgPC0KICBnZ01hcmdpbmFsKGFmdGdyLCB0eXBlID0gJ2hpc3RvZ3JhbScpCnAyCnAxCmBgYAoKCkJhc2VkIG9uIHRoZXNlIGdlbmVyYWwgc2NhdHRlcnBsb3RzIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxhcmdlIGNoYW5nZSBiZXR3ZWVuIGJldHdlZW4gc3BpbiByYXRlIGFuZCB2ZWxvY2l0eS4gVGhlIGJveHBsb3RzIG9uIHRoZSBzaWRlIHNob3cgdGhhdC4uLgotbW9zdCBvZiB0aGUgb3V0bGllcnMgYXJlIGRhcmtlciBzaGFkZWQgZG90cyBzaG93aW5nIHRoYXQgdGhvc2UgcGl0Y2hlcnMgZ2VuZXJhbGx5IGhhdmVuJ3QgdGhyb3duIGFzIG1hbnkgcGl0Y2hlcy4KLU5vdyBsZXQncyBjaGFuZ2UgdGhlIHJhbmdlIGluIHRoZSBudW1iZXIgb2YgcGl0Y2hlcyB0byBhYm92ZSAzMjUuLi4uCgoKYGBge3J9CmI0YWJ2IDwtCiAgYjQlPiUKICBmaWx0ZXIodG90YWxfcGl0Y2hlcyA+IDI0OSkKYjRhYnYKYGBgCgpgYGB7cn0KYWZ0YWJ2IDwtCiAgYWZ0JT4lCiAgZmlsdGVyKHRvdGFsX3BpdGNoZXMgPiAyNDkpCmFmdGFidgpgYGAKCmBgYHtyfQpiYWJ2Z3IgPC0KICBiNGFidiAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2ZWxvY2l0eSwgeSA9IHNwaW5fcmF0ZSwgY29sb3IgPSB0b3RhbF9waXRjaGVzKSkgKwogIGdlb21fcG9pbnQoc3RhdCA9ICdpZGVudGl0eScpICsKICB4bGFiKCdWZWxvY2l0eSAobXBoKScpICsKICB5bGFiKCdTcGluIFJhdGUgKHJwbSknKSArCiAgbGFicyhjb2xvciA9ICdUb3RhbCBQaXRjaGVzJywKICAgICAgIHRpdGxlID0gJ1NwaW4gUmF0ZSB2cyBWZWxvY2l0eSBCZWZvcmUgSnVuZSAxc3QnLAogICAgICAgY2FwdGlvbiA9ICdGb3IgcGl0Y2hlcnMgd2l0aCBvdmVyIDI1MCBwaXRjaGVzJykgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYygpCgpgYGAKCgpgYGB7cn0KYWZhYnZnciA8LQogIGFmdGFidiAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2ZWxvY2l0eSwgeSA9IHNwaW5fcmF0ZSwgY29sb3IgPSB0b3RhbF9waXRjaGVzKSkgKwogIGdlb21fcG9pbnQoc3RhdCA9ICdpZGVudGl0eScpICsKICB4bGFiKCdWZWxvY2l0eSAobXBoKScpICsKICB5bGFiKCdTcGluIFJhdGUgKHJwbSknKSArCiAgbGFicyhjb2xvciA9ICdUb3RhbCBQaXRjaGVzJywKICAgICAgIHRpdGxlID0gJ1NwaW4gUmF0ZSB2cyBWZWxvY2l0eSBBZnRlciBKdW5lIDFzdCcsCiAgICAgICBjYXB0aW9uID0gJ0ZvciBwaXRjaGVycyB3aXRoIG92ZXIgMjUwIHBpdGNoZXMnKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19jKCkKCmsxIDwtIAogIGdnTWFyZ2luYWwoYWZhYnZnciwgdHlwZSA9ICdoaXN0b2dyYW0nKQprMQoKZzEgPC0KICBnZ01hcmdpbmFsKGJhYnZnciwgdHlwZSA9ICdoaXN0b2dyYW0nKQpnMQpgYGAKCkhlcmUgd2UgY2FuIHNlZSB0aGF0Li4uCgoKIyMgSW5kaXZpZHVhbCBQaXRjaGVyIENoYW5nZXMKCiMjIyMgVHJldm9yIEJhdWVyCgpJdCdzIGhhcmQgdG8gaGF2ZSBhbnkgY29udmVyc2F0aW9uIGFib3V0IGZvcmVpZ24gc3Vic3RhbmNlcyBpbiBiYXNlYmFsbCB3aXRob3V0IG1lbnRpb25pbmcgVHJldm9yIEJhdWVyLiBGcm9tIGJlaW5nIHNvbWVvbmUgd2hvIGluaXRpYWxseSBzcG9rZW4gYWdhaW5zdCBmb3JlaWduIHN1YnN0YW5jZXMsIG9uY2UgZXZlbiBzdGF0aW5nIHRoYXQgdGhleSBjb3VsZCBiZSBtb3JlIHBvd2VyZnVsIHRoYW4gc3Rlcm9pZHMsIHRvIG5vdyBiZWluZyBhY2N1c2VkIG9mIGhhdmluZyB0aGUgbW9zdCBlZmZlY3RpdmUgc3Vic3RhbmNlIGNvbWJpbmF0aW9uIGluIHRoZSBnYW1lLCBCYXVlcidzIG5hbWUgaGFzIGJlZW4gYnJvdWdodCB1cCBhIGxvdC4KCmBgYHtyfQpiYXVlciA8LQogIHJlYWQuY3N2KCdiYXVlciBhZHZhbmNlZCBzdGF0cy5jc3YnKQpiYXVlcgpgYGAKCgpgYGB7cn0KdGJqdTI4IDwtCiAgYmF1ZXIgJT4lCiAgZmlsdGVyKGdhbWVfZGF0ZSA9PSAnMjAyMS0wNi0yOCcpCnRianUyOApgYGAKCgoKYGBge3J9CnRiMjhnciA8LQogIHRianUyOCU+JQogIGdncGxvdChhZXMoeCA9IGF0X2JhdF9udW1iZXIgLCB5ID0gcmVsZWFzZV9zcGluX3JhdGUsIGNvbG9yID0gcGl0Y2hfbmFtZSkpICsKICBnZW9tX2xpbmUoc3RhdCA9ICdpZGVudGl0eScpKwogIHhsYWIoJ0F0IEJhdCBOdW1iZXInKSArCiAgeWxhYignUmVsZWFzZSBTcGluIFJhdGUnKSArCiAgbGFicyh0aXRsZSA9ICJUcmV2b3IgQmF1ZXIncyBTcGluIFJhdGUgYnkgUGl0Y2ggVHlwZSIsCiAgICAgICBjb2xvciA9ICdQaXRjaCBOYW1lJywKICAgICAgIGNhcHRpb24gPSAnRnJvbSBoaXMgbGFzdCBnYW1lIG9uIEp1bmUgMjh0aCcpCnRiMjhncgpgYGAKCgpgYGB7cn0KdGJqdTYgPC0KICBiYXVlciAlPiUKICBmaWx0ZXIoZ2FtZV9kYXRlID09ICcyMDIxLTA2LTA2JykKdGJqdTYKYGBgCgpgYGB7cn0KdGI2Z3IgPC0KICB0Ymp1NiU+JQogIGdncGxvdChhZXMoeCA9IGF0X2JhdF9udW1iZXIgLCB5ID0gcmVsZWFzZV9zcGluX3JhdGUsIGNvbG9yID0gcGl0Y2hfbmFtZSkpICsKICBnZW9tX2xpbmUoc3RhdCA9ICdpZGVudGl0eScpKwogIHhsYWIoJ0F0IEJhdCBOdW1iZXInKSArCiAgeWxhYignUmVsZWFzZSBTcGluIFJhdGUnKSArCiAgbGFicyh0aXRsZSA9ICJUcmV2b3IgQmF1ZXIncyBTcGluIFJhdGUgYnkgUGl0Y2ggVHlwZSIsCiAgICAgICBjb2xvciA9ICdQaXRjaCBOYW1lJywKICAgICAgIGNhcHRpb24gPSAnRnJvbSBnYW1lIHBpdGNoZWQgb24gSnVuZSA2dGgnKQp0YjZncgp0YjI4Z3IKYGBgCgoKIyMjIyBKYWNvYiBkZUdyb20KCiMjIyMgR2Vycml0IENvbGUKCmBgYHtyfQpnY29sZWR0IDwtCiAgcmVhZC5jc3YoJ0dlcnJpdCBDb2xlIGFkdmFuY2VkIHN0YXRzLmNzdicpCmdjb2xlZHQKYGBgCgoKYGBge3J9CmdjanUzIDwtCiAgZ2NvbGVkdCAlPiUKICBmaWx0ZXIoZ2FtZV9kYXRlID09ICcyMDIxLTA2LTAzJykKZ2NqdTMKYGBgCgoKYGBge3J9CmdjamwxMCA8LQogIGdjb2xlZHQgJT4lCiAgZmlsdGVyKGdhbWVfZGF0ZSA9PSAnMjAyMS0wNy0xMCcpCmdjamwxMApgYGAKCgpgYGB7cn0KZ2NqdTNnciA8LQogIGdjanUzICU+JQogIGdncGxvdChhZXMoeCA9IGF0X2JhdF9udW1iZXIsIHkgPSByZWxlYXNlX3NwaW5fcmF0ZSwgY29sb3IgPSBwaXRjaF9uYW1lKSkgKwogIGdlb21fbGluZShzdGF0ID0gJ2lkZW50aXR5JykgKwogIHhsYWIoJ0F0IEJhdCBOdW1iZXInKSArCiAgeWxhYignUmVsZWFzZSBTcGluIFJhdGUnKSArCiAgbGFicyh0aXRsZSA9ICJHZXJyaXQgQ29sZSdzIFNwaW4gUmF0ZSBieSBQaXRjaCIsCiAgICAgICBjYXB0aW9uID0gJ0Zyb20gdGhlIGdhbWUgcGl0Y2hlZCBvbiBKdW5lIDNyZCcsCiAgICAgICBjb2xvciA9ICdQaXRjaCBUeXBlJykKZ2NqdTNncgpgYGAKCgpgYGB7cn0KZ2NqbDEwZ3IgPC0KICBnY2psMTAgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYXRfYmF0X251bWJlciwgeSA9IHJlbGVhc2Vfc3Bpbl9yYXRlLCBjb2xvciA9IHBpdGNoX25hbWUpKSArCiAgZ2VvbV9saW5lKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgeGxhYignTnVtYmVyIEF0IEJhdCcpICsKICB5bGFiKCdSZWxlYXNlIFNwaW4gUmF0ZScpICsKICBsYWJzKHRpdGxlID0gIkdlcnJpdCBDb2xlJ3MgU3BpbiBSYXRlIGJ5IFBpdGNoIFR5cGUiLAogICAgICAgY2FwdGlvbiA9ICdGcm9tIHRoZSBnYW1lIENvbGUgcGl0Y2hlZCBvbiBKdWx5IDEwdGgnLAogICAgICAgY29sb3IgPSAnUGl0Y2ggVHlwZScpCmdjamwxMGdyCmdjanUzZ3IKYGBgCgoKIyMjIyBKdWxpbyBVcmlhcwoKIyMjIyBHYXJyZXR0IFJpY2hhcmRzCmBgYHtyfQoKYGBgCgoK